﻿using Autofac;
using Autofac.Extensions.DependencyInjection;
using MediatR;
using MediatRApp.IServices;
using MediatRApp.Services;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MediatRApp
{
    public static class Program
    {
        private static IContainer Container { get; set; }

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 配置Autofac容器
            ConfigureContainer();

            // 从容器中解析主窗体并运行应用程序
            using (ILifetimeScope scope = Container.BeginLifetimeScope())
            {
                MainForm mainForm = scope.Resolve<MainForm>();
                Application.Run(mainForm);
            }
        }

        /// <summary>
        /// 配置依赖注入容器，注册应用程序所需的服务和组件
        /// 使用Autofac容器构建器完成以下注册：
        /// 1. MediatR框架的核心组件及其处理器
        /// 2. 应用程序服务实现
        /// 3. 窗体类实例
        /// 最后构建并设置全局静态容器
        /// </summary>
        private static void ConfigureContainer()
        {
            // 创建Autofac容器构建器实例
            ContainerBuilder builder = new ContainerBuilder();

            /* 
             * 注册MediatR相关组件：
             * 1. 注册MediatR核心程序集中的所有接口实现
             * 2. 注册当前程序集的所有请求处理器(IRequestHandler<,>)
             * 3. 注册当前程序集的所有通知处理器(INotificationHandler<>)
             */
            builder.RegisterAssemblyTypes(typeof(IMediator).Assembly).AsImplementedInterfaces();
            builder.RegisterAssemblyTypes(typeof(Program).Assembly).AsClosedTypesOf(typeof(IRequestHandler<,>));
            builder.RegisterAssemblyTypes(typeof(Program).Assembly).AsClosedTypesOf(typeof(INotificationHandler<>));

            // 注册应用层服务，将UserService绑定到IUserService接口，并设置每个生命周期作用域一个实例
            builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();

            // 注册主窗体类，设置整个应用程序只有一个实例
            builder.RegisterType<MainForm>().SingleInstance();

            // 将Microsoft.Extensions.DependencyInjection中的服务集合，集成到Autofac容器中
            ServiceCollection services = new ServiceCollection();
            builder.Populate(services);

            // 构建容器并赋值给全局静态属性
            Container = builder.Build();
        }
    }
}
